import os
from functools import wraps
from flask import Flask, request, jsonify, send_from_directory, render_template, session, flash, redirect, url_for
from routes.LoginRegister import main_bp
from routes.VideoUpload import video_bp
from models.database import connect, close  # 确保connect/close函数正确连接数据库

# 初始化应用
app = Flask(__name__)

# 配置Session密钥（用于加密登录状态，生产环境替换为随机复杂字符串）
app.secret_key = "random_secret_key_2025_xyz"

# 关键修改：登录拦截装饰器（适配前端模态框，不跳转新页面）
def login_required(f):
    @wraps(f)  # 保留原视图函数元信息
    def decorated_function(*args, **kwargs):
        # 检查Session中是否有用户标识（登录成功后设置）
        if 'user_id' not in session:
            # 未登录：通过模板变量传递"需要登录"标记，让前端显示模态框
            # 执行原视图函数（返回detect.html或profile.html），并添加need_login参数
            response = f(*args, **kwargs)
            # 给渲染的模板注入need_login变量（Flask模板渲染支持添加额外参数）
            if hasattr(response, 'template') and response.template in ['detect.html', 'profile.html']:
                # 重新渲染模板，添加need_login=True参数
                return render_template(response.template, need_login=True)
            return response
        # 已登录：传递用户信息给前端，用于更新UI
        user_info = {
            'username': session.get('user_name'),
            'email': session.get('user_email')
        }
        response = f(*args, **kwargs)
        if hasattr(response, 'template') and response.template in ['detect.html', 'profile.html']:
            return render_template(response.template, need_login=False, user_info=user_info)
        return response
    return decorated_function

# 初始化数据库连接测试
print("正在测试数据库连接...")
db = connect()
if db:
    print("数据库初始化成功")
    close(db)
else:
    print("警告: 数据库连接失败，请检查配置")

# 配置上传目录
UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'uploads')
PROCESSED_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'processed')
ALLOWED_EXTENSIONS = {'mp4', 'mov', 'avi', 'wmv', 'jpg', 'jpeg', 'png', 'webm'}
MAX_CONTENT_LENGTH = 200 * 1024 * 1024  # 200MB

# 创建必要的文件夹（原有代码不变）
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(PROCESSED_FOLDER, exist_ok=True)

# 配置Flask（原有代码不变）
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['PROCESSED_FOLDER'] = PROCESSED_FOLDER
app.config['MAX_CONTENT_LENGTH'] = MAX_CONTENT_LENGTH
app.register_blueprint(main_bp)
app.register_blueprint(video_bp)

# 注意：视频和图像处理功能已移至routes/VideoUpload.py中（原有代码不变）

@app.route('/')
def index():
    """返回前端页面"""
    return render_template('index.html')

@app.route('/faq.html')
def faq():
    """返回常见问题页面"""
    return render_template('faq.html')

@app.route('/intro.html')
def intro():
    """返回介绍页面"""
    return render_template('intro.html')

# 受保护页面：添加登录拦截装饰器
@app.route('/detect.html')
@login_required
def detect():
    """返回检测页面（需登录）"""
    return render_template('detect.html')  # 装饰器会自动注入need_login和user_info变量

# 受保护页面：添加登录拦截装饰器
@app.route('/profile.html')
@login_required
def profile():
    """返回个人中心页面（需登录）"""
    return render_template('profile.html')  # 装饰器会自动注入need_login和user_info变量

# 新增：退出登录接口（供前端调用）
@app.route('/api/logout', methods=['POST'])
def logout():
    """清除Session，实现退出登录"""
    session.pop('user_id', None)
    session.pop('user_name', None)
    session.pop('user_email', None)
    return jsonify({
        'success': True,
        'message': '退出登录成功'
    }), 200

if __name__ == '__main__':
    print("已生效的路由：")
    for rule in app.url_map.iter_rules():
        print(f"路径: {rule.rule}, 方法: {list(rule.methods)}")
    app.run(debug=True, host='0.0.0.0', port=5000)